#include <bits/stdc++.h>
using namespace std;

// 检查从 l 到 r（包含）中，
// 在 s1 阶段或 s2 阶段有一些“必翻”的位置是否全能在“字典序保 0”的选择下满足。
// 这里用一个 prefix sum + 必翻标记来快速判断区间内的必翻位置数是否超后缀容量。
// 这个辅助函数在下面会用到。
bool can_keep_zero(
    int idx,
    const vector<int>& must_flip,     // must_flip[i]=1 表示 i 要在本阶段翻
    const vector<int>& suff_capacity  // suff_capacity[i] 表示 i 之后（含i）还剩多少“资源”能支持翻
){
    // 如果 idx 本身不是 must_flip，则留 0 总是安全
    if(!must_flip[idx]) return true;
    // 否则留 0 就意味着我们少翻了 1 个，是否能被后缀“资源”cover？
    // suff_capacity[idx+1] 要 >= must_flip.sum(idx+1..end)
    // 这里为示例，具体实现中我们用前缀和区间和 + 一次扫描就能做到 O(1) 判断。
    return suff_capacity[idx+1] >= 1;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    string s;
    cin >> n >> s;

    // --- 阶段一：标出能 0→1 的“可选翻” candidate1[i] ---
    vector<int> orig0(n+2,0), orig1(n+2,0);
    for(int i=n-1;i>=0;i--){
        orig0[i] = orig0[i+1] + (s[i]=='0');
        orig1[i] = orig1[i+1] + (s[i]=='1');
    }
    vector<int> candidate1(n,0);
    for(int i=0;i<n;i++){
        if(s[i]=='0' && orig0[i] > orig1[i]){
            candidate1[i] = 1; // 这一位可选 0→1
        }
    }
    // 在这一阶段，没有“必翻”位置，只有可选和不可选。
    // 但我们为统一接口，把 candidate1 当作 must_flip1=0/1。
    vector<int> must_flip1 = candidate1;

    // suff_capacity1[i] 表示从 i..n-1，最多还能“被后续翻回 0” 的次数。
    // 这个“资源”其实是阶段二的后续能力。但我们先保守估计，用 orig1-orig0 也行。
    // 这里只示意，细节上你要用阶段二的后续统计来构造 suff_capacity1。
    vector<int> suff_capacity1(n+2, 0);
    // ... 省略统计，实际可线性预处理 ...

    // 按字典序，从左到右，对 candidate1 做取舍：
    string s1 = s;
    for(int i=0;i<n;i++){
        // 我们想在这里“keep 0” 优先：
        if(candidate1[i] && can_keep_zero(i, must_flip1, suff_capacity1)){
            // keep 0，不翻
        } else {
            // 翻成 1
            if(candidate1[i]){
                s1[i] = '1';
            }
        }
    }

    // --- 阶段二：在 s1 上同理标出 candidate2, must_flip2, suff_capacity2 ---
    vector<int> s10(n+2,0), s11(n+2,0);
    for(int i=n-1;i>=0;i--){
        s10[i] = s10[i+1] + (s1[i]=='0');
        s11[i] = s11[i+1] + (s1[i]=='1');
    }
    vector<int> candidate2(n,0), must_flip2(n,0);
    for(int i=0;i<n;i++){
        if(s1[i]=='1' && s11[i] > s10[i]){
            candidate2[i] = must_flip2[i] = 1;
        }
    }
    vector<int> suff_capacity2(n+2,0);
    // ... 同样预处理 suff_capacity2 ...

    // 按字典序，从左到右，做阶段二选 0→1（其实是 1→0）：
    string t = s1;
    for(int i=0;i<n;i++){
        if(candidate2[i] && can_keep_zero(i, must_flip2, suff_capacity2)){
            t[i] = '0';
        } else {
            // keep 1
        }
    }

    cout << t << "\n";
    return 0;
}
